package com.ms.game.sendgift.db;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import com.ms.game.itembox.db.ItemDAO;
import com.ms.game.itembox.db.PlayerItemModel;
import com.ms.game.sendgift.GiftPlayerData;
import com.ms.game.sendgift.SendGiftProcessor;
import com.ms.game.sendgift.SendGiftStage;
import com.ms.player.Player;
import com.ms.service.error.ErrorCode;
import com.ms.service.module.datacenterlite.CentralAsyncCommand;
import com.xpec.c4.game.time.TimeSys;
import com.xpec.c4.game.utility.GUID;
import com.xpec.c4.service.message.MessageAction;

public class LoadSendGiftOrderDCLAsync extends CentralAsyncCommand {

	/**
	 * 
	 */
	private static final long serialVersionUID = 4474974286219533185L;
	
	/**
	 * 送禮物訂單ID
	 */
	public long orderID;
	
	/**
	 * 玩家ID
	 */
	public GUID playerID;
	
	/**
	 * 現在的處理階段
	 * @link SendGiftStage
	 */
	public int nextStage;
	
	/**
	 * Response MessageType
	 */
	public int messageType;
	
	/**
	 * 撈回的資料
	 */
	private SendGiftNotifyModel sendGiftModel;

	/**
	 * 取回的寄送道具清單
	 */
	private ArrayList<PlayerItemModel> sendGiftItems;
	
	/**
	 * 是否已完成
	 */
	private boolean isFinish = false;
	
	/**
	 * 正確的階段
	 */
	private boolean isTureStage = false;
	
	/**
	 * 是否過期
	 */
	private boolean isOverTime = false;
	
	/**
	 * 不是這階段的回答人
	 */
	private boolean isStageAnswer = false;
	
	@Override
	public void asyncExecute() throws Exception {
		
		sendGiftModel = SendGiftDAO.loadSendGiftNotifyModelByOrderID(orderID);
		//沒有資料
		if(sendGiftModel == null){
			return;
		}

		//已經結束並且領取過的
		if(sendGiftModel.isFinish() && sendGiftModel.isTaken()){
			isFinish = true;
			return;
		}

		Date timeNow = Calendar.getInstance().getTime();
		isOverTime = TimeSys.currentTimeMills() > sendGiftModel.getOverTime().getTime();
		if(!sendGiftModel.isFinish() && isOverTime){
			return;
		} else if (nextStage == SendGiftStage.FIRST_CANCEL) {
			if(!(sendGiftModel.getStage() == SendGiftStage.FIRST_CREATE || 
			   sendGiftModel.getStage() == SendGiftStage.FIRST_CANCEL)){
				return;
			}
			
			isTureStage = true;
	
			// 不是這個玩家 不同階段做不同判斷
			if (!sendGiftModel.getPlayerGUID().equals(playerID.toString())) {
				return;
			}
			
			isStageAnswer = true;		
			
			if(!sendGiftModel.isFinish()){
				sendGiftModel.setAnswerTime(timeNow);
				sendGiftModel.setOrderFinishTime(timeNow);
				sendGiftModel.setFinish(true);
				sendGiftModel.setStage(nextStage);
			}else{
				sendGiftModel.setFinalTakenTime(timeNow);
				sendGiftModel.setTaken(true);
			}
		} else if (nextStage == SendGiftStage.SECOND_ACCEPT || nextStage == SendGiftStage.SECOND_REJECT) {
			if(sendGiftModel.getStage() != SendGiftStage.FIRST_CREATE){
				return;
			}
			
			isTureStage = true;
			
			// 不是這個玩家 不同階段做不同判斷
			if (!sendGiftModel.getTargetGUID().equals(playerID.toString())) {
				return;
			}
			
			isStageAnswer = true;	
			
			// 第二步跟第二步取消直接設定
			sendGiftModel.setAnswerTime(timeNow);
			sendGiftModel.setStage(nextStage);
			if(nextStage == SendGiftStage.SECOND_REJECT){
				//拒絕 ， 設定成 finish
				sendGiftModel.setFinish(true);
				sendGiftModel.setOrderFinishTime(timeNow);
			}
			
		} else if (nextStage == SendGiftStage.FINIAL_SEND) {
			if(sendGiftModel.getStage() != SendGiftStage.SECOND_ACCEPT){
				return;
			}
			
			isTureStage = true;
			
			// 不是這個玩家 不同階段做不同判斷
			if (!sendGiftModel.getPlayerGUID().equals(playerID.toString())) {
				return;
			}
			
			isStageAnswer = true;	
			
			// 第三步 確認送出
			sendGiftModel.setFinishTime(timeNow);
			sendGiftModel.setStage(nextStage);
			sendGiftModel.setFinish(true);
			sendGiftModel.setOrderFinishTime(timeNow);
			
		} else if(nextStage == SendGiftStage.FINAL_TAKEN){
			if(sendGiftModel.getStage() != SendGiftStage.FINIAL_SEND){
				return;
			}
			
			isTureStage = true;

			// 不是這個玩家 不同階段做不同判斷
			if (!sendGiftModel.getTargetGUID().equals(playerID.toString())) {
				return;
			}
			
			isStageAnswer = true;	

			// 取回寄送道具清單
			sendGiftModel.setFinalTakenTime(timeNow);
			sendGiftModel.setTaken(true);
			sendGiftModel.setStage(nextStage);
			
		} else if(nextStage == SendGiftStage.SENDER_REJECT_TAKEN){
			if(sendGiftModel.getStage() != SendGiftStage.SECOND_REJECT){
				return;
			}
			
			isTureStage = true;
			
			// 不是這個玩家 不同階段做不同判斷
			if (!sendGiftModel.getPlayerGUID().equals(playerID.toString())) {
				return;
			}
			
			isStageAnswer = true;	

			// 取回寄送道具清單
			sendGiftModel.setFinalTakenTime(timeNow);
			sendGiftModel.setTaken(true);
			sendGiftModel.setStage(nextStage);
			
		}else if(nextStage == SendGiftStage.TIME_OUT_OREDER_TAKEN){
			if(sendGiftModel.getStage() != SendGiftStage.TIME_OUT_ORDER_RETURN){
				return;
			}
			isTureStage = true;
			
			// 不是這個玩家 不同階段做不同判斷
			if (!sendGiftModel.getPlayerGUID().equals(playerID.toString())) {
				return;
			}
			isStageAnswer = true;	
			
			sendGiftModel.setFinalTakenTime(timeNow);
			sendGiftModel.setTaken(true);
			sendGiftModel.setStage(nextStage);
		}else if (nextStage == SendGiftStage.GMTOOL_RETURN_ORDER_TAKEN){
			if(!(sendGiftModel.getStage() == SendGiftStage.DISABLE_SEND_BY_GMTOOL ||
					sendGiftModel.getStage() == SendGiftStage.FORCE_SEND_GIFT_RETURN_BY_GMTOOL)){
				return;
			}
			
			isTureStage = true;
			
			// 不是這個玩家 不同階段做不同判斷
			if (!sendGiftModel.getPlayerGUID().equals(playerID.toString())) {
				return;
			}
			
			isStageAnswer = true;	
			
			sendGiftModel.setFinalTakenTime(timeNow);
			sendGiftModel.setTaken(true);
			sendGiftModel.setStage(nextStage);
		}else{
			return;
		}
		
		SendGiftDAO.saveGiftNotify(sendGiftModel);
		sendGiftItems = ItemDAO.loadSendGiftItems(sendGiftModel.getOrderID());
	}

	@Override
	public void callBackExecute(Object... userData) throws Exception {		
		GiftPlayerData giftData = (GiftPlayerData)userData[0];
		Player playerData = giftData.playerData;
		
		if(sendGiftModel == null){
			//沒有訂單資料
			giftData.response.errorCode = ErrorCode.SEND_GIFT_ORDER_NULL;
			MessageAction.sendMessage(giftData.sessionID, messageType, giftData.response);
			return;
		}
		
		if(isFinish){
			//訂單已完成
			giftData.response.errorCode = ErrorCode.SEND_GIFT_IS_FINISH;
			MessageAction.sendMessage(giftData.sessionID, messageType, giftData.response);
			return;
		}
		
		if(!sendGiftModel.isFinish() && isOverTime){
			giftData.response.errorCode = ErrorCode.SEND_GIFT_OVER_TIME;
			MessageAction.sendMessage(giftData.sessionID, messageType, giftData.response);
			return;
		}
		
		if(!isTureStage){
			//階段錯誤
			giftData.response.errorCode = ErrorCode.SEND_GIFT_THIS_STAGE_ERROR;
			MessageAction.sendMessage(giftData.sessionID, messageType, giftData.response);
			return;
		}
		
		if(!isStageAnswer){
			//回覆者並非本人
			giftData.response.errorCode = ErrorCode.SEND_GIFT_ANSWER_ID_ERROR;
			MessageAction.sendMessage(giftData.sessionID, messageType, giftData.response);
			return;
		}
		
		if(nextStage == SendGiftStage.FIRST_CANCEL){
			if(!sendGiftModel.isTaken()){
				SendGiftProcessor.OnSendGiftCancelFirstStepCallBack(messageType, giftData, sendGiftModel, giftData.module);	
			}else {
				SendGiftProcessor.OnSendGiftCancelFirstStepCallBack2(messageType, giftData, sendGiftModel, sendGiftItems);
			}
		}
		  else if (nextStage == SendGiftStage.SECOND_ACCEPT || nextStage == SendGiftStage.SECOND_REJECT) {	
			SendGiftProcessor.OnSendGiftSecondAcceptCallBack(messageType, giftData.sessionID, playerData, sendGiftModel, giftData.response, giftData.module);
		} else if(nextStage == SendGiftStage.FINIAL_SEND){
			SendGiftProcessor.OnSendGiftFinalAcceptCallBack(messageType, giftData.sessionID, playerData, sendGiftModel, giftData.response, giftData.module);
		} else if (nextStage == SendGiftStage.FINAL_TAKEN) {
			SendGiftProcessor.OnSendGiftFinalTakenCallBack(messageType, giftData, sendGiftModel, sendGiftItems);
		} else if(nextStage == SendGiftStage.SENDER_REJECT_TAKEN){
			SendGiftProcessor.OnSendGiftGetRejectedOrderCallBack(messageType, giftData, sendGiftModel, sendGiftItems);
		} else if(nextStage == SendGiftStage.TIME_OUT_OREDER_TAKEN){
			SendGiftProcessor.OnSendGiftGetTimeoutOrderCallBack(messageType, giftData, sendGiftModel, sendGiftItems);
		} else if(nextStage == SendGiftStage.GMTOOL_RETURN_ORDER_TAKEN){
			SendGiftProcessor.OnGetGMReturnOrderCallBack(messageType, giftData, sendGiftModel, sendGiftItems);
		} 
	}

	public SendGiftNotifyModel getSendGiftModel() {
		return sendGiftModel;
	}

	public boolean isTureStage() {
		return isTureStage;
	}

	public ArrayList<PlayerItemModel> getSendGiftItems() {
		return sendGiftItems;
	}
	
	public boolean isFinish() {
		return isFinish;
	}

	public boolean isOverTime() {
		return isOverTime;
	}

	public boolean isStageAnswer() {
		return isStageAnswer;
	}
	
}
